import java.util.concurrent.PriorityBlockingQueue;

//创建一个类，用来放任务
class MyTask2 implements Comparable<MyTask2>{
    //创建一个任务
    private Runnable runnable;
    //规定啥时候执行，设置一个时间戳
    private long time;

    //进行重写
    //此处的delay 是一个时间段，用来计算离规定时间还有多长时间
    public MyTask2(Runnable runnable, long delay){
        this.runnable = runnable;
        this.time = System.currentTimeMillis() + delay;
    }

    //创建一个执行的方法
    public void run(){
        runnable.run();
    }

    //实现一个获取当前时间的方法
    public long getTime(){
        return time;
    }

    @Override
    public int compareTo(MyTask2 o) {
        return (int) (this.time - o.time);
    }
}

//创建一个线程类
class MyTimer2{
    //用一个数据结构方法
    private PriorityBlockingQueue<MyTask2> queue = new PriorityBlockingQueue<>();

    //创建一个scheduler方法
    public void scheduler(Runnable runnable, long delay){
        MyTask2 task2 = new MyTask2(runnable,delay);

        queue.put(task2);
        //每次执行一次任务，就唤醒一次扫描线程
        synchronized (this){
            this.notify();
        }
    }

    //实现一个构造方法
    public MyTimer2(){
        //创建一个线程
        Thread thread = new Thread(() ->{
            while(true){
                //先获取当前元素
                try {
                    MyTask2 task2 = queue.take();
                    //获取当前时间
                    long curTimer = System.currentTimeMillis();
                    //当前时间与规定时间进行比较
                    if(curTimer < task2.getTime()){
                        //时间还没有到，就把任务再放回
                        queue.put(task2);
                        //规定等待的时间，用规定时间减去现在的时间
                        synchronized (this){
                            this.wait(task2.getTime() - curTimer);
                        }
                    }else{
                        //执行任务
                        task2.run();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}
public class Test4 {
    public static void main(String[] args) {
        MyTimer timer = new MyTimer();
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("你好啊");
            }
        },2000);
        System.out.println("我很好");
    }
}
